import string
import random
with open("big.data","w+", encoding="utf-8") as f:
 for i in range(100):
  f.write(("".join(random.choices(string.ascii_lowercase,k=random.randint(1,50)))+"\n"))

def read_file(path):
    with open (path,"r+") as f:
     line1, max = "", 0
     while f.readline():
       line1=f.readline()
       l=len(line1)
       if (l>max):
           yield line1
f=read_file("big.data")
list2=list(f)
print (list2[-1],len(list2[-1]))

"""
如何判断一个对象是可迭代对象，迭代器对象或生成器
如果一个对象定义了 __iter__ 和 __next__ 两个方法，它就是一个迭代器。
而如果一个对象定义了 __iter__ ，返回一个迭代器对象，那么它就是一个可迭代的对象。
生成器是特定的迭代器，它完全实现了迭代器接口，所以所有生成器都是迭代器。
不过，迭代器用于从数据集中取出元素；而生成器用于"凭空"生成(yield)元素。
它不会一次性将所有元素全部生成，而是按需一个一个地生成，所以从头到尾都只需占用一个元素的内存空间。
判断方法dir（）查看属性 ISINSTANCE（要判断的，类型） 生成器(标志yield 使用()生成generator 将两表推导式[]改成()即可得到生成器  生成器的形式 1()生成器表达式   )

迭代器生成器区别:
生成器 好处是自己不需要生成iter next 只用yield
使用()生成generator 将两表推导式[]改成()即可得到生成器
代器用于从数据集中取出元素；而生成器用于"凭空"生成(yield)元素。
它不会一次性将所有元素全部生成，而是按需一个一个地生成，所以从头到尾都只需占用一个元素的内存空间。
生成器可以用更少地中间变量写流式代码，生成器相比其它容器对象它更能节省内存，生成器可以用更少的代码来实现相似的功能

迭代器和可迭代对象
1）可迭代对象包含迭代器。
2）如果一个对象拥有__iter__方法，其是可迭代对象；如果一个对象拥有next方法，其是迭代器。
3）定义可迭代对象，必须实现__iter__方法；定义迭代器，必须实现__iter__和next方法。
工厂函数产生可迭代对象
iter（a）将可迭代对象变为迭代器
如何定义一个生成器
1生成器函数 定义一个函数  用yield 生成返回所需数据 2使用()生成generator 将两表推导式[]改成()即可得到生成器 )
如何获取可迭代对象迭代器生成器中的数据
可迭代对象 直接用for循环  迭代器 调用next方法  生成器有 yield 关键字，调用生成器函数时，就会返回一个生成器对象。
"""